(function () {
  /**
   * 以 abstract 开头的类 是抽象类
   *          抽象类和其它类区别不大，只是不能用来创建对象
   *          抽象类就是专门被用来继承的类
   * 
   *          抽象类中可以添加抽象方法
   */
  abstract class Person {
    name: string
    constructor(name: string) {
      this.name = name
    }
    /**
     * 定义一个抽象方法
     * 抽象方法使用abstract开头，没有方法体
     * 抽象方法只能定义在抽象类中，子类必须对抽象方法进行重写
     */
    abstract sayHello(): void
  }

  class personSon extends Person {

    sayHello() {
      console.log('呜呜呜')
    }
  }

  class personDad extends Person {
    sayHello() {
      console.log('我是你爹')
    }
  }

  const son = new personSon('小王子')
  son.sayHello()

  // const per = new Person('测试') //报错

})()
